<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

</body>
<script>
    /**
     * 模拟实现Promise.all功能，处理多个Promise并行执行并收集结果
     * @param {Array} promises - 待处理的Promise对象数组（可包含非Promise值）
     * @returns {Promise} 返回一个新的Promise对象：
     *   - 当所有输入Promise都成功时，resolve结果为按输入顺序排列的完成值数组
     *   - 任意输入Promise失败时，立即reject第一个失败原因
     */
    function myPromiseAll(promises){
        // 创建并返回主Promise
        return new Promise((resolve,reject) => {
            // 边界情况：空数组直接返回已解决的Promise
            if (promises.length === 0){
                resolve([])
            }

            // 初始化结果容器和完成计数器
            let results = new Array(promises.length)
            let resolveCount = 0

            // 遍历处理每个Promise项
            for(let i = 0; i < promises.length; i++){
                let promise = promises[i]

                // 用Promise.resolve包裹确保统一处理（包括非Promise值）
                Promise.resolve(promise).then(value => {
                    // 按索引位置存储结果值
                    results[i] = value
                    resolveCount++

                    // 当所有Promise均完成时，解决主Promise
                    if(resolveCount === promises.length){
                        resolve(results)
                    }
                }).catch((err) => {
                    // 捕获到第一个错误时立即拒绝主Promise
                    reject(err)
                })
            }
        })
    }

    const p1 = 1;
    const p2 = new Promise((resolve) => setTimeout(resolve, 100, 'foo'));
    const p3 = fetch('https://jsonplaceholder.typicode.com/todos/1').then(res => res.json());

    myPromiseAll([p1, p2, p3])
        .then(values => console.log('Test1:', values))
        .catch(error => console.error('Test1 Error:', error));

    // 测试用例2: 其中一个Promise失败
    const p4 = Promise.resolve(100);
    const p5 = Promise.reject('出错了');
    const p6 = new Promise((resolve) => setTimeout(resolve, 200, 'bar'));

    myPromiseAll([p4, p5, p6])
        .then(values => console.log('Test2:', values))
        .catch(error => console.error('Test2 Error:', error));

    // 测试用例3: 空数组
    myPromiseAll([])
        .then(values => console.log('Test3:', values)) // 应输出 []
        .catch(error => console.error('Test3 Error:', error));
</script>
</html>